Many modern computer systems are able to execute more than one distinct software program, or “thread”, at a time. For this reason they are referred to as “multi-threaded” computer systems. In one approach, called sequential multi-threaded operation, the operating system or other control mechanism permits the several threads to share resources by permitting each thread that is a candidate for execution to operate in sequence on the processor. Changing between threads may be referred to as thread switching. In some of these approaches, threads are switched when the currently executing thread reaches a point when it cannot proceed, such as waiting for a memory access or an I/O transfer to finish, or when the currently executing thread has executed a particular number of instructions. The selection of the next thread to be switched in (permitted use of execution resources) may be made on the basis of strict priority. In other approaches, a round-robin approach may be used in thread switching.
Multi-threaded processor operations make great demands on system bus utilization. For this reason unnecessary accesses to system memory over a system bus should be avoided. One type of access to system memory is a prefetch, generated in one situation when a memory access instruction is expected not to find the necessary data or instruction in cache (a “cache miss”). The prefetch loads data or instructions from system memory into cache at a time prior to the expected execution of such a memory access instruction, thereby causing the memory access instruction to find the necessary data or instruction in cache (a “cache hit”). However, excessive inaccurate prefetching due to poor instruction and data prediction may slow down system performance rather than improving performance.